package com.examsystem.service.impl;


import com.examsystem.dao.ExcelMapper;
import com.examsystem.service.ExcelService;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.math3.exception.NullArgumentException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 86134
 */
@Service("excelServiceImpl")
public class ExcelServiceImpl implements ExcelService {
    @Resource
    private ExcelMapper excelMapper;

    /*
    教师端
     */


    /**
	 * 先上传文件 ，解析文件中的数据
	 */
	@Override
	public String uploadExcel(MultipartFile file) throws Exception {
		
		if (file == null) {
			throw new NullArgumentException();
        }
        String filename = file.getOriginalFilename();
        if (filename == null) {
        	throw new NullArgumentException();
        }
        String a = "";
        try {
        		// 调用解析文件方法
            	a = parseRowCell(filename, file.getInputStream());
            return a;
        } catch (IOException e) {
                throw new Exception(e.getMessage());
        }

	}

	/**
	 * 解析文件中的数据
	 */
	public String parseRowCell(String filename, InputStream is) {
		Map<Object, Object> map = new HashMap<>();
        int i = 0;
		try {
            Workbook workbook = null;
            // 判断excel的后缀，不同的后缀用不同的对象去解析
            // xls是低版本的Excel文件
            if (filename.endsWith(".xls")) {
                workbook = new HSSFWorkbook(is);
            }
            // xlsx是高版本的Excel文件
            if (filename.endsWith(".xlsx")) {
                workbook = new XSSFWorkbook(is);
            }
            if (workbook == null) {
                throw new NullArgumentException();
            }
            
            // 取到excel 中的第一张工作表
            Sheet sheet = workbook.getSheetAt(0);
            if (sheet == null) {
            	throw new NullArgumentException();
            }
            
            // 工作表中第一行是表头，不获取，从第二行开始获取
            for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) {
            	// 获取到这一行的数据
                Row row = sheet.getRow(rowNum);
                if (row == null) {
                    continue;
                }
				
				/*
				 * 以下的取数据，具体看你的Excel文件中有多少列数据，以此类推
				*/                

                // 取到这一行的第一列数据 (设备名称)，赋值给deviceName
                String content = "";
                if (row.getCell(0) != null) {
                    row.getCell(0).setCellType(CellType.STRING);
                    content = row.getCell(0).getStringCellValue().trim();
                }

                // 取到这一行的第二列数据 (设备类型)，赋值给deviceType
                String type = "";
                if (row.getCell(1) != null) {
                    row.getCell(1).setCellType(CellType.STRING);
                    type = row.getCell(1).getStringCellValue().trim();
                }

                // 取到这一行的第三列数据 (设备型号)，赋值给specification
                String answer = "";
                if (row.getCell(2) != null) {
                    row.getCell(2).setCellType(CellType.STRING);
                    answer = row.getCell(2).getStringCellValue().trim();
                }
                
                // 取到这一行的第四列数据 (总数量)，赋值给total
                String score = "";
                if (row.getCell(3) != null) {
                    row.getCell(3).setCellType(CellType.NUMERIC);
                    score = row.getCell(3).getStringCellValue();
                }
                double end = Double.parseDouble(score);
                i = excelMapper.insertExcel(content, type, answer, end) + i;
                if (StringUtils.isAnyBlank(content,type,answer,score)) {

                    continue;
                }

                if (StringUtils.isAnyBlank(content,type,answer,score)) {
                    throw new NullArgumentException();
                }
                
            }
            if (i > 0) {
                return "true";
            }else {
                return "false";
            }

        } catch (IOException e) {
        	return e.getMessage();
        }
			
	}

}
